from abc import ABC, abstractmethod
from typing import List, Dict, Tuple

from vec_database.config import KB_INFO
from langchain.docstore.document import Document


class VDBService(ABC):
    # param: 构造函数
    # param: knowledge_base_name 库的名称
    # param: embed_model 嵌入模型
    def __init__(self,
                 knowledge_base_name: str,
                 embed_model: str):
        # 嵌入模型的名称
        self.embed_model = embed_model

        # 库名称
        self.kb_name = knowledge_base_name
        # 知识库的名称
        self.kb_info = KB_INFO.get(knowledge_base_name, f"关于{knowledge_base_name}的知识库")
        # url
        self.url_path = "http://{127.0.0.1:8080}"
        # 库本地存储存储路径
        self.vs_path = None
        self.do_init()

    # 构造函数的扩展函数:存在价值是被子类重写
    @abstractmethod
    def do_init(self):
        pass

    # 增-创建知识库表:存在价值是被子类重写
    @abstractmethod
    def do_create_table(self):
        pass

    # 删-删除知识库表:存在价值是被子类重写
    @abstractmethod
    def do_drop_table(self):
        pass

    # 清-从清除知识库表向量(内容):存在价值是被子类重写
    @abstractmethod
    def do_clear_table(self):
        pass

    # 增-向知识库添加文档:存在价值是被子类重写
    @abstractmethod
    def do_add_doc(self,
                   docs: List[Document],
                   **kwargs,
                   ) -> List[Dict]:
        pass

        # 删-根据文件路径从向量库中删除
        # param kb_file_souce 文件的路径
        def do_delete_doc(self,
                          kb_file_souce: str):
            pass

    # 删-根据文件路径从向量库中删除:存在价值是被子类重写
    # param kb_file_souce 文件的路径
    @abstractmethod
    def do_delete_doc(self,
                      kb_file: str):
        pass

    # 改-修改向量内容
    @abstractmethod
    def do_update_doc(self):
        pass

    # 查-根据条件搜索知识库内容
    @abstractmethod
    def do_search_doc(self,
                      query: str, top_k: int,
                      score_threshold: float,
                      ) -> List[Tuple[Document, float]]:
        pass

    # 查-根据唯一id获取内容
    def get_doc_by_ids(self, ids: List[str]) -> List[Document]:
        return []

    # 删-根据ids从向量库中删除
    # @param ids 向量库中唯一id集合
    def do_delete_docs_by_ids(self, ids: List[str]) -> bool:
        raise NotImplementedError
